package cdtserver;

// Recebe um pacote de algum cliente
// Separa o dado, o endereço IP e a porta deste cliente
// Imprime o dado na tela
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

class UDPServer extends Thread {
    connectionType connectType;
    int windowsSize;
    
    public UDPServer() {};
    public void UDPServer(connectionType ConnType, int winSize){
        connectType = ConnType;
        windowsSize = winSize;
    }

    public void run(){
        while(!waitConnection()){
            System.out.println("Waiting connection...");
            try {
                sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public Message receivePacket() {
        System.out.println("Server listening...");

        // cria socket do servidor com a porta 9876
        DatagramSocket serverSocket = null;
        try {
            serverSocket = new DatagramSocket(9876);
        } catch (SocketException ex) {
            Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex);
        }

        byte[] receiveData = new byte[1024];

        // declara o pacote a ser recebido
        DatagramPacket receivePacket =
                new DatagramPacket(receiveData,
                receiveData.length);
        try {
            // recebe o pacote do cliente
            serverSocket.receive(receivePacket);
        } catch (IOException ex) {
            Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex);
        }

        // pega os dados, o endereço IP e a porta do cliente
        // para poder mandar a msg de volta
        String sentence = new String(
                receivePacket.getData());
        InetAddress IPAddress =
                receivePacket.getAddress();
        int port = receivePacket.getPort();

        System.out.println("Mensagem recebida: " + sentence);

        //transforma sequencia de bytes em Message
        Message msg = new Message();
        return msg;
    }

    public boolean waitConnection()
    {
        //Aguarda mensagem do cliente com tipo requestConnection
        //essa msg também informa tipo goBackn, selectiveReject tamanho da janela
        //no campo data com um formato proprio
        Message msgReceived;
        boolean keepWaiting = true;

        while(keepWaiting){

            msgReceived = receivePacket();
            if(msgReceived.getType() == connectionType.requestConnection){
                keepWaiting = false;
            }
            try {
                sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(UDPServer.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        return true;
    }
}

